home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / lib / calc / deg.cal < prev    next >
Text File  |  1995-07-17  |  2KB  |  125 lines

  1. /*
  2.  * Copyright (c) 1993 David I. Bell
  3.  * Permission is granted to use, distribute, or modify this source,
  4.  * provided that this copyright notice remains intact.
  5.  *
  6.  * Calculate in degrees, minutes, and seconds.
  7.  */
  8.  
  9. obj dms {deg, min, sec};
  10.  
  11. define dms(deg, min, sec)
  12. {
  13.     local ans;
  14.  
  15.     if (isnull(sec))
  16.         sec = 0;
  17.     if (isnull(min))
  18.         min = 0;
  19.     obj dms ans;
  20.     ans.deg = deg;
  21.     ans.min = min;
  22.     ans.sec = sec;
  23.     fixdms(&ans);
  24.     return ans;
  25. }
  26.  
  27.  
  28. define dms_add(a, b)
  29. {
  30.     local obj dms    ans;
  31.  
  32.     ans.deg = 0;
  33.     ans.min = 0;
  34.     ans.sec = 0;
  35.     if (istype(a, ans)) {
  36.         ans.deg += a.deg;
  37.         ans.min += a.min;
  38.         ans.sec += a.sec;
  39.     } else
  40.         ans.deg += a;
  41.     if (istype(b, ans)) {
  42.         ans.deg += b.deg;
  43.         ans.min += b.min;
  44.         ans.sec += b.sec;
  45.     } else
  46.         ans.deg += b;
  47.     fixdms(&ans);
  48.     return ans;    
  49. }
  50.  
  51.  
  52. define dms_neg(a)
  53. {
  54.     local obj dms    ans;
  55.  
  56.     ans.deg = -ans.deg;
  57.     ans.min = -ans.min;
  58.     ans.sec = -ans.sec;
  59.     return ans;
  60. }
  61.  
  62.  
  63. define dms_sub(a, b)
  64. {
  65.     return a - b;
  66. }
  67.  
  68.  
  69. define dms_mul(a, b)
  70. {
  71.     local obj dms    ans;
  72.  
  73.     if (istype(a, ans) && istype(b, ans))
  74.         quit "Cannot multiply degrees together";
  75.     if (istype(a, ans)) {
  76.         ans.deg = a.deg * b;
  77.         ans.min = a.min * b;
  78.         ans.sec = a.sec * b;
  79.     } else {
  80.         ans.deg = b.deg * a;
  81.         ans.min = b.min * a;
  82.         ans.sec = b.sec * a;
  83.     }
  84.     fixdms(&ans);
  85.     return ans;
  86. }
  87.  
  88.  
  89. define dms_print(a)
  90. {
  91.     print a.deg : 'd' : a.min : 'm' : a.sec : 's' :;
  92. }
  93.  
  94.  
  95. define dms_abs(a)
  96. {
  97.     return a.deg + a.min / 60 + a.sec / 3600;
  98. }
  99.  
  100.  
  101. define fixdms(a)
  102. {
  103.     a.min += frac(a.deg) * 60;
  104.     a.deg = int(a.deg);
  105.     a.sec += frac(a.min) * 60;
  106.     a.min = int(a.min);
  107.     a.min += a.sec // 60;
  108.     a.sec %= 60;
  109.     a.deg += a.min // 60;
  110.     a.min %= 60;
  111.     a.deg %= 360;
  112. }
  113.  
  114. global lib_debug;
  115. if (lib_debug >= 0) {
  116.     print "obj dms {deg, min, sec} defined";
  117.     print "dms(deg, min, sec) defined";
  118.     print "dms_add(a, b) defined";
  119.     print "dms_neg(a) defined";
  120.     print "dms_sub(a, b) defined";
  121.     print "dms_mul(a, b) defined";
  122.     print "dms_print(a) defined";
  123.     print "dms_abs(a) defined";
  124. }
  125.